package com.witsight.cassandra.dao;

import java.util.List;

import org.springframework.cassandra.core.PreparedStatementBinder;
import org.springframework.cassandra.core.PreparedStatementCreator;
import org.springframework.cassandra.core.ResultSetExtractor;
import org.springframework.cassandra.core.RowCallback;
import org.springframework.cassandra.core.RowCallbackHandler;
import org.springframework.data.cassandra.core.CassandraOperations;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.querydsl.QuerydslPredicateArgumentResolver;

import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;
import com.datastax.driver.core.Statement;
import com.witsight.platform.model.BoEntity;

/**   
 * 说明：动态CQL的CassandraOperations
 * @Title: PageCassandraOperations.java 
 * @Package com.witsight.cassandra.dao 
 * @See: {@link CassandraOperations}
 * Copyright: Copyright (c) 2017
 * Company:sany huax witsight team by product
 * @author: penght  
 * @date: 2017年9月27日 下午6:00:10 
 * @version: V1.0
 *
 */
public interface PageCassandraOperations extends CassandraOperations {
	/**
	 * 
	 * 说明：翻页检索
	 * @Title: queryPage
	 * @See: {@link QuerydslPredicateArgumentResolver}
	 * @author penght
	 * @param query  检索条件
	 * @param params 参数
	 * @param pageable 翻页对象
	 * @param rowCallback 行回调
	 * @return 
	 * @date: 2017年10月9日 下午2:39:24
	 */
	<T> List<T> queryPage(String query,final BoEntity params, Pageable pageable, RowCallback<T> rowCallback);
	/**
	 * 
	 * 说明：根据检索条件检索数据
	 * @Title: query
	 * @See: {@link #query(PreparedStatementCreator, PreparedStatementBinder, RowCallbackHandler)}
	 * @author penght
	 * @param query 检索cql
	 * @param params 参数
	 * @param rowCallbackHandler 行回调
	 * @date: 2017年9月28日 下午3:47:35
	 */
	void query(String query,final BoEntity params, RowCallbackHandler rowCallbackHandler);
	
	/**
	 * 
	 * 说明：根据检索条件检索数据 (ResultSet 接口返回)
	 * @Title: query
	 * @See: {@link #query(PreparedStatementCreator, PreparedStatementBinder, ResultSetExtractor)}
	 * @author penght
	 * @param query 检索cql
	 * @param params 参数
	 * @param resultSetExtractor 行回调
	 * @date: 2017年9月28日 下午3:47:35
	 */
	<T> T query(String query,final BoEntity params, ResultSetExtractor<T> resultSetExtractor);
	
	/**
	 * 
	 * 说明：转换BoEntity
	 * @Title: toBoEntity
	 * @See: {@link #toBoEntity(Row)}
	 * @author penght
	 * @param row 行数据
	 * @return BoEntity
	 * @date: 2017年9月29日 上午7:57:19
	 */
	BoEntity toBoEntity(Row row);
	/**
	 * 
	 * 说明：检索总数
	 * @Title: selectCount
	 * @See: {@link #selectCount(String)}
	 * @author penght
	 * @param countCql 
	 * @return 
	 * @date: 2017年9月29日 上午8:34:26
	 */
	long selectCount(String countCql);
	/**
	 * 
	 * 说明：根据检索条件检索数据page(ResultSet 接口返回)
	 * @Title: query
	 * @See: {@link #query(PreparedStatementCreator, PreparedStatementBinder, ResultSetExtractor)}
	 * @author penght
	 * @param query 检索cql
	 * @param params 参数
	 * @param resultSetExtractor 行回调
	 * @date: 2017年9月28日 下午3:47:35
	 */
	<T> T queryPage(String query,final BoEntity params, Pageable pageable, ResultSetExtractor<T> resultSetExtractor) ;
	/**
	 * 
	 * 说明：翻页跳行方法
	 * @Title: skipRows
	 * @See: {@link #skipRows(Statement, int, int)}
	 * @author penght
	 * @param statement 检索statement
	 * @param start 开始
	 * @param size 结束
	 * @return 结果集合
	 * @date: 2017年9月28日 上午8:42:43
	 */
	ResultSet skipRows(Statement statement, int start, int size);
	
	/**
	 * 
	 * 说明：动态的创建参数
	 * @Title: createStatement
	 * @See: {@link #createStatement(String, BoEntity)}
	 * @author penght
	 * @param cql cql query语句
	 * @param params 参数
	 * @return Statement
	 * @date: 2017年9月28日 下午2:15:19
	 */
//	Statement createStatement(String cql, BoEntity params);
}
